package studio.raptor.databus.command;

import java.util.Arrays;
import java.util.Map;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import org.hibernate.validator.constraints.NotEmpty;

/**
 * Created on 2017/4/25.
 */
public class EventMetaData implements Serializable {

    private static final long serialVersionUID = -2391615872012353463L;
    /**
     * 业务编号
     */
    @NotEmpty(message = "businessNo should not be empty")
    private String businessNo;
    /**
     * 业务类型
     */
    private EventMetaDataBusinessType businessType;

    /**
     * 地区ID，业务发生所属地区编码
     */
    @NotNull(message = "regionId should not be null")
    private Long regionId;
    /**
     * 产品规格ID和业务动作ID的对应关系，具体格式如下：<br>
     * prodSpecId1:业务动作Id1,prodSpecId1:业务动作Id2,prodSpecID2:业务动作ID3
     */
    private String prodIds;


    /**
     * 销售品ID与业务动作ID的对应关系，具体格式如下：<br>
     * offerSpecId1:业务动作Id1,offerSpecId1:业务动作Id2,offerSpecID2:业务动作ID3
     */
    private String offerIds;

    /**
     * 销售品规格属性与业务动作的对应关系<br>
     * offerSpecAttr1：业务动作id1，offerSpecAttr1：业务动作id2，offerSpecAttr2：业务动作id3
     */
    private String offerSpecAttrs ;

    /**
     * 服务规格和业务动作对应关系，具体格式如下<br>
     * serviceSpecId1:业务动作id1,serviceSpecId1:业务动作id2,serviceSpecId2:业务动作id3
     */
    private String serviceOfferIds;

    /**
     * 服务规格属性与业务动作对应关系，具体格式如下<br>
     * serviceSpecAttr1:业务动作id1,serviceSpecAttr1:业务动作id2,serviceSpecAttr2:业务动作id3
     */
    private String serviceSpecAttrs;

    /**
     * 销售品关联所有产品ID,元素为产品ID
     */
    private Long[] offerProdId;

    /**
     * 业务动作，多个值之间用英文模式下的逗号进行分隔，如<br>
     * orderTypeID1,orderTypeID2
     */
    private String orderTypeIds;
    /**
     * 客户ID
     */
    private Long[] custId;
    /**
     * 账户ID
     */
    private Long[] acctId;
    /**
     * 产品ID
     */
    private Long[] prodInstId;

    /**
     * 销售品ID
     */
    private Long[] offerInstId;

    /**
     * 用于存储公共属性，供统计日志上下游消息
     */
    private Map<String,String> publicMap;

    public EventMetaDataBusinessType getBusinessType() {
        return businessType;
    }

    /**
     * 设置业务类型
     * @param businessType 业务类型(普通业务、停复机业务)
     */
    public void setBusinessType(EventMetaDataBusinessType businessType) {
        this.businessType = businessType;
    }


    public Long getRegionId() {
        return regionId;
    }

    /**
     * 设置发生地区编码
     * @param regionId 发生地区编码
     */
    public void setRegionId(Long regionId) {
        this.regionId = regionId;
    }

    public Long[] getCustId() {
        return custId;
    }

    /**
     * 设置客户ID
     * @param custId 客户ID
     */
    public void setCustId(Long[] custId) {
        this.custId = custId;
    }

    public Long[] getAcctId() {
        return acctId;
    }

    /**
     * 设置账户ID
     * @param acctId 账户ID
     */
    public void setAcctId(Long[] acctId) {
        this.acctId = acctId;
    }

    public Long[] getOfferInstId() {
        return offerInstId;
    }

    /**
     * 设置销售品ID
     * @param offerInstId 销售品ID
     */
    public void setOfferInstId(Long[] offerInstId) {
        this.offerInstId = offerInstId;
    }

    /**
     * 获取业务编号
     * @return 业务编号
     */
    public String getBusinessNo() {
        return businessNo;
    }

    /**
     * 设置业务编号
     * @param businessNo 业务编号
     */
    public void setBusinessNo(String businessNo) {
        this.businessNo = businessNo;
    }

    /**
     * 返回产品规格和业务动作ID对应关系
     * @return  产品规格和业务动作ID对应关系
     */
    public String getProdIds() {
        return prodIds;
    }

    /**
     * 设置产品规格ID和业务动作ID的对应关系
     *
     * @param prodIds 产品规格和业务动作ID对应关系，如:prodSpecId1:业务动作Id1,prodSpecId1:业务动作Id2,prodSpecID2:业务动作ID3
     *
     */
    public void setProdIds(String prodIds) {
        this.prodIds = prodIds;
    }

    /**
     * 获取销售品规格ID与业务动作ID对应关系
     * @return 销售品规格ID与业务动作ID对应关系
     */
    public String getOfferIds() {
        return offerIds;
    }

    /**
     * 设置销售品规格ID与业务动作ID对应关系
     * @param offerIds 销售品规格ID与业务动作ID对应关系，如【offerSpecId1:业务动作Id1,offerSpecId1:业务动作Id2,offerSpecID2:业务动作ID3】
     */
    public void setOfferIds(String offerIds) {
        this.offerIds = offerIds;
    }

    /**
     * 获取销售品规格属性和业务动作的对应关系
     * @return 销售品规格属性和业务动作的对应关系
     */
    public String getOfferSpecAttrs() {
        return offerSpecAttrs;
    }

    /**
     * 设置销售品规格属性和业务动作的对应关系
     * @param offerSpecAttrs 销售品规格属性和业务动作对应关系，如【offerSpecAttr1：业务动作id1，offerSpecAttr1：业务动作id2，offerSpecAttr2：业务动作id3】
     */
    public void setOfferSpecAttrs(String offerSpecAttrs) {
        this.offerSpecAttrs = offerSpecAttrs;
    }

    /**
     * 获取服务规格ID与业务动作ID的对应关系
     * @return 服务规格ID与业务动作ID的对应关系
     */
    public String getServiceOfferIds() {
        return serviceOfferIds;
    }

    /**
     * 设置服务规格ID与业务动作ID的对应关系
     * @param serviceOfferIds 服务规格ID与业务动作ID的对应关系,如【serviceSpecId1:业务动作id1,serviceSpecId1:业务动作id2,serviceSpecId2:业务动作id3】
     */
    public void setServiceOfferIds(String serviceOfferIds) {
        this.serviceOfferIds = serviceOfferIds;
    }

    /**
     * 获取服务规格属性与业务动作映射关系
     * @return 服务规格属性
     */
    public String getServiceSpecAttrs() {
        return serviceSpecAttrs;
    }

    /**
     * 设置服务规格属性与业务动作映射关系
     * @param serviceSpecAttrs 服务规格属性，如【serviceSpecAttr1:业务动作id1,serviceSpecAttr1:业务动作id2,serviceSpecAttr2:业务动作id3】
     */
    public void setServiceSpecAttrs(String serviceSpecAttrs) {
        this.serviceSpecAttrs = serviceSpecAttrs;
    }

    /**
     * 获取销售品关联产品ID
     * @return 销售品关联产品ID
     */
    public Long[] getOfferProdId() {
        return offerProdId;
    }

    /**
     * 设置销售品关联产品ID
     * @param offerProdId 销售品关联产品ID
     */
    public void setOfferProdId(Long[] offerProdId) {
        this.offerProdId = offerProdId;
    }

    /**
     * 获取业务动作
     * @return 业务动作
     */
    public String getOrderTypeIds() {
        return orderTypeIds;
    }

    /**
     * 设置业务动作
     * @param orderTypeIds 业务动作，若包含多个，中间用逗号分开，如【orderTypeId1,orderType2】
     */
    public void setOrderTypeIds(String orderTypeIds) {
        this.orderTypeIds = orderTypeIds;
    }

    public Long[] getProdInstId() {
        return prodInstId;
    }

    public void setProdInstId(Long[] prodInstId) {
        this.prodInstId = prodInstId;
    }

    public Map<String, String> getPublicMap() {
        return publicMap;
    }

    public void setPublicMap(Map<String, String> publicMap) {
        this.publicMap = publicMap;
    }

    @Override
    public String toString() {
        return "EventMetaData{" +
            "businessNo='" + businessNo + '\'' +
            ", businessType=" + businessType +
            ", regionId=" + regionId +
            ", prodIds='" + prodIds + '\'' +
            ", offerIds='" + offerIds + '\'' +
            ", offerSpecAttrs='" + offerSpecAttrs + '\'' +
            ", serviceOfferIds='" + serviceOfferIds + '\'' +
            ", serviceSpecAttrs='" + serviceSpecAttrs + '\'' +
            ", offerProdId=" + Arrays.toString(offerProdId) +
            ", orderTypeIds='" + orderTypeIds + '\'' +
            ", custId=" + Arrays.toString(custId) +
            ", acctId=" + Arrays.toString(acctId) +
            ", prodInstId=" + Arrays.toString(prodInstId) +
            ", offerInstId=" + Arrays.toString(offerInstId) +
            ", publicMap=" + publicMap +
            '}';
    }
}
